/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.uniceub.fsw.util;

import java.lang.reflect.Method;
import java.util.*;

/**
 * Classe com métodos de geração automática de código HTML
 * @author Abrahao
 */
public class Html {

    /**
     * Este metodo cria uma tabela HTML apartir de uma lista de objetos;
     * A tabela é criada usando todos os atributos do objeto
     * @param l
     * @return String
     */
    public String criarTabela(List l) {
        StringBuffer tabela = new StringBuffer();
        try {
            Class cls = l.get(0).getClass();
            cls.newInstance();
            //String nomeClasse = cls.getName();
            //Captura todos os metodos da classe
            Method metodos[] = cls.getDeclaredMethods();
            List metodosGet = new ArrayList();
            //Captura os metodos GET da classe
            for (int i = 0; i < metodos.length; i++) {
                if (metodos[i].getName().startsWith("get")) {
                    metodosGet.add(metodos[i]);
                }
            }
            tabela.append("<TABLE><TR>\n");
            String[] titulos = new String[metodosGet.size()];
            //Obter Títulos da Tabela (Atributos do Objeto)     
            for (int i = 0; i < metodosGet.size(); i++) {
                String aux = metodosGet.get(i).toString();
                int inicio = aux.lastIndexOf(".") + 4;
                titulos[i] = aux.substring(inicio, aux.length() - 2);
                tabela.append("<TD>" + titulos[i] + "</TD>\n");
            }
            tabela.append("</TR>\n");
            //Obter atributos
            for (int i = 0; i < l.size(); i++) {
                if (i % 2 == 0) {
                    tabela.append("<TR>\n");
                } else {
                    tabela.append("<TR class=\"impar\">\n");
                }
                for (int j = 0; j < metodos.length; j++) {
                    if (metodos[j].getName().startsWith("get")) {
                        tabela.append("<TD>" + metodos[j].invoke(l.get(i), null) + "</TD>\n");
                    }
                }
                tabela.append("</TR>");
            }
            tabela.append("</TABLE>");
        } catch (Throwable e) {
            System.err.println(e);
        }
        return tabela.toString();
    }

    /**
     * Este metodo cria uma combobox HTML apartir de uma lista de objetos;
     * Recebe como parametro a lista de objetos, o nome do atributo que será a chave,
     * o nome do atributo que devera ser exibido na combobox e o número do id do campo
     * que deverá estar pré-selecionado.
     * @param l
     * @param chave
     * @param descricao
     * @param selected
     * @return String
     */
    public String criarComboBox(List l, String chave, String descricao, int selected) {
        StringBuffer combo = new StringBuffer();
        String lDescricao = "";
        String lChave = "";
        combo.append("<SELECT name='" + chave + "' class='select' onFocus=\"this.className='onfocus';\" onBlur=\"this.className='onblur';\" >\n");
        chave = chave.substring(0, 1).toUpperCase().concat(chave.substring(1));
        descricao = descricao.substring(0, 1).toUpperCase().concat(descricao.substring(1));
        try {
            Class cls = l.get(0).getClass();
            Method[] metodos = cls.getDeclaredMethods();
            for (int j = 0; j < l.size(); j++) {
                for (int i = 0; i < metodos.length; i++) {
                    if (metodos[i].getName().contains("get" + chave)) {
                        lChave = metodos[i].invoke(l.get(j), null).toString();
                    }
                    if (metodos[i].getName().contains("get" + descricao)) {
                        lDescricao = metodos[i].invoke(l.get(j), null).toString();
                    }
                }
                if (Integer.parseInt(lChave) == selected) {
                    combo.append("<OPTION value='" + lChave + "' selected>" + lDescricao + "</OPTION>\n");
                } else {
                    combo.append("<OPTION value='" + lChave + "'>" + lDescricao + "</OPTION>\n");
                }

            }
        } catch (Throwable e) {
            System.err.println(e);
        }
        combo.append("</SELECT>");
        return combo.toString();
    }

    /**
     * Cria uma tabela HTML apartir de uma lista de objetos, uma
     * lista de atributos e uma de titulos.
     * @param l
     * @param atributos
     * @param titulos
     * @return
     */
    public String criarTabela(List l, String[] atributos, String[] titulos) {
        StringBuffer tabela = new StringBuffer();
        try {
            Class cls = l.get(0).getClass();
            //Captura todos os metodos da classe
            Method metodos[] = cls.getDeclaredMethods();
            //String atributo = new String();
            tabela.append("<TABLE><TR>\n");
            for (int i = 0; i < titulos.length; i++) {
                tabela.append("<TD>" + titulos[i] + "</TD>\n");
            }
            tabela.append("</TR>\n");
            for (int i = 0; i < l.size(); i++) {
                if (i % 2 == 0) {
                    tabela.append("<TR>\n");
                } else {
                    tabela.append("<TR class=\"impar\">\n");
                }
                for (int j = 0; j < metodos.length; j++) {
                    for (int k = 0; k < atributos.length; k++) {
                        atributos[k] = atributos[k].substring(0, 1).toUpperCase().concat(atributos[k].substring(1));
                        if (metodos[j].getName().contains("get" + atributos[k])) {
                            tabela.append("<TD>" + metodos[j].invoke(l.get(i), null) + "</TD>\n");
                        }
                    }
                }

                tabela.append("</TR>");
            }
            tabela.append("</TABLE>");
        } catch (Throwable e) {
            System.err.println(e);
        }
        return tabela.toString();
    }

    /**
     * Este método cria uma lista HTML apartir de uma lista de objetos.
     * Deve ser informado como parâmetro: o tipo da lista, o tipo de marcador
     * e o nome do atributo que aparecerá na lista
     * @param l
     * @param tipo
     * @param marcador
     * @param atributo
     * @return Lista HTML
     */
    public String criarLista(List l, String tipo, String marcador, String atributo) {
        StringBuffer lista = new StringBuffer();

        try {
            Class cls = l.get(0).getClass();
            //Captura todos os metodos da classe
            Method metodos[] = cls.getDeclaredMethods();
            //String atributo = new String();
            lista.append("<" + tipo + " type=\"" + marcador + "\">\n");
            atributo = atributo.substring(0, 1).toUpperCase().concat(atributo.substring(1));
            for (int i = 0; i < l.size(); i++) {
                for (int j = 0; j < metodos.length; j++) {
                    if (metodos[j].getName().contains("get" + atributo)) {
                        lista.append("<li>" + metodos[j].invoke(l.get(i), null) + "</li>\n");
                    }
                }
            }
            lista.append("</" + tipo + ">\n");
        } catch (Throwable e) {
            System.err.println(e);
        }
        return lista.toString();
    }

    /**
     * Este método cria uma tabela HTML com os inputs HTML de um formulario,
     * apartir de uma VO.
     * o parâmetro "preencher" define se o formulario já é criado preenchido
     * ou se é criado vazio
     * 
     * @param vo
     * @param preencher
     * @return Retorna uma String com o código HTML de geração dos campos do formulário
     */
    public String criarInputs(Object vo, boolean preencher) {
        StringBuffer form = new StringBuffer();
        InputHtml input = new InputHtml();

        try {
            Method[] metodos = vo.getClass().getDeclaredMethods();
            //form.append("<ul>");
            form.append("<TABLE>");
            for (int i = 0; i < metodos.length; i++) {

                if (metodos[i].getName().startsWith("get")) {
                    form.append("<TR>");
                    form.append("<TD>" + input.getTitulo() + ":</TD>");
                    // form.append("<li>");
                    input = input.getTipoInput(metodos[i].getName().substring(3));
                    if (input.getType().equalsIgnoreCase("textarea")) {
                        form.append("<TD><textarea name='" + input.getName() + "'" + input.getJavaScript() + ">");
                        if (preencher) {
                            form.append(metodos[i].invoke(vo, null));
                        }
                        form.append("</textarea></TD>");
                    } else {
                        form.append(input.getTitulo() +
                                "<TD><input type='" + input.getType() + "' " +
                                "name='" + input.getName() + "' " +
                                "class='" + input.getClassName() + "' " +
                                "size='" + input.getSize() + "' " +
                                " maxlength=" + input.getMaxlength() +
                                " " + input.getJavaScript());
                        if (preencher) {
                            form.append(" value='" + metodos[i].invoke(vo, null) + "' ");
                        }
                        form.append("></TD>\n");
                    }
                    form.append("</TR>");


                //form.append("</li>");
                }


            }
            form.append("</TABLE>");
        //   form.append("</ul>");
        } catch (Throwable e) {
            System.err.print(e);
        }
        return form.toString();

    }

    /**
     * Cria uma table HTML com os inputs de um formulario HTML apartir de objeto VO.
     * @param vo
     * @param preencher
     * @param atributos
     * @param titulos
     * @return Retorna uma String com o código HTML de geração dos campos do formulário
     */
    public String criarInputs(Object vo, boolean preencher, List<String> atributos, List<String> titulos) {
        StringBuffer form = new StringBuffer();
        InputHtml input = new InputHtml();

        try {
            Method[] metodos = vo.getClass().getDeclaredMethods();
            //form.append("<ul>");
            for (int i = 0; i < metodos.length; i++) {
                for (int j = 0; j < atributos.size(); j++) {
                    form.append("<TR>");
                    form.append("<TD>" + titulos.get(j) + ":</TD>");
                    atributos.set(j, Character.toUpperCase(atributos.get(j).charAt(0)) + atributos.get(j).substring(1));
                    if (metodos[i].getName().contains("get" + atributos.get(j))) {
                        // form.append("<li>");
                        input = input.getTipoInput(metodos[i].getName().substring(3));
                        if (input.getType().equalsIgnoreCase("textarea")) {
                            form.append("<TD><textarea name='" + input.getName() + "'" + input.getJavaScript() + ">");
                            if (preencher) {
                                form.append(metodos[i].invoke(vo, null));
                            }
                            form.append("</textarea></TD>");
                        } else {
                            form.append(input.getTitulo() +
                                    "<TD><input type='" + input.getType() + "' " +
                                    "name='" + input.getName() + "' " +
                                    "class='" + input.getClassName() + "' " +
                                    "size='" + input.getSize() + "' " +
                                    " maxlength=" + input.getMaxlength() +
                                    " " + input.getJavaScript());
                            if (preencher) {
                                form.append(" value='" + metodos[i].invoke(vo, null) + "' ");
                            }
                            form.append("><TD>\n");
                        }
                    //form.append("</li>");
                    }
                    form.append("</TR>");
                }


            }
        //   form.append("</ul>");
        } catch (Throwable e) {
            System.err.print(e);
        }
        return form.toString();

    }

    /**
     * Cria um campo input ou textarea HTML, definindo CSS e JavaScript de acordo com o tipo
     * de dado do atributo.
     * @param atributo
     * @return
     */
    public String criarInput(String atributo, String value) {
        StringBuffer sb = new StringBuffer();
        InputHtml input = new InputHtml();
        input = input.getTipoInput(atributo);
        if (input.getType().equalsIgnoreCase("textarea")) {
            sb.append("<textarea maxlength=" + input.getMaxlength() + " class='" +
                    input.getClassName() + "' name='" + input.getName() + "' " +
                    input.getJavaScript() + ">" + value + "</textarea>");

        } else {
            sb.append("<input type='" + input.getType() + "' name='" +
                    input.getName() + "' class='" + input.getClassName() +
                    "' size=" + input.getSize() + " maxlength=" +
                    input.getMaxlength() + " value='" + value + "' " + input.getJavaScript() + ">");
        }
        return sb.toString();

    }

    /**
     * Cria uma tabela com um radio buton em cada linha, com value=id
     * @param l
     * @return
     */
    public String criarTabelaRadio(List l) {
        StringBuffer tabela = new StringBuffer();
        try {
            Class cls = l.get(0).getClass();
            Method metodos[] = cls.getDeclaredMethods();
            List metodosGet = new ArrayList();
            //Captura os metodos GET da classe
            for (int i = 0; i < metodos.length; i++) {
                if (metodos[i].getName().startsWith("get")) {
                    metodosGet.add(metodos[i]);
                }
            }

            tabela.append("<TABLE><TR>\n");

            String[] titulos = new String[metodosGet.size()];
            //Obter Títulos da Tabela (Atributos do Objeto)     
            for (int i = 0; i < metodosGet.size(); i++) {
                String aux = metodosGet.get(i).toString();
                int inicio = aux.lastIndexOf(".") + 4;
                titulos[i] = aux.substring(inicio, aux.length() - 2);
                tabela.append("<TD>" + titulos[i] + "</TD>\n");
            }
            tabela.append("</TR>\n");
            //Obter atributos
            for (int i = 0; i < l.size(); i++) {
                if (i % 2 == 0) {
                    tabela.append("<TR>\n");
                } else {
                    tabela.append("<TR class=\"impar\">\n");
                }
                for (int j = 0; j < metodos.length; j++) {
                    if (metodos[j].getName().startsWith("get")) {
                        if (metodos[j].getName().contains("Id")) {
                            tabela.append("<TD><input class='radio' type='radio' name='" + metodos[j].getName().substring(3) + "' value='" + metodos[j].invoke(l.get(i), null) + "'></TD>\n");
                        } else {
                            tabela.append("<TD>" + metodos[j].invoke(l.get(i), null) + "</TD>\n");
                        }
                    }
                }
                tabela.append("</TR>");
            }
            tabela.append("</TABLE>");
        } catch (Throwable e) {
            System.err.println(e);
        }
        return tabela.toString();
    }

    /**
     * Cria uma tabela com um radio buton em cada linha
     * 
     * @param l
     * @param atributos
     * @param titulos
     * @return
     */
    public String criarTabelaRadio(List l, String[] atributos, String[] titulos, String chave) {
        StringBuffer tabela = new StringBuffer();
        try {
            chave = Character.toUpperCase(chave.charAt(0)) + chave.substring(1);
            Class cls = l.get(0).getClass();
            //Captura todos os metodos da classe
            Method metodos[] = cls.getDeclaredMethods();
            //String atributo = new String();
            tabela.append("<TABLE><TR class='tituloTabela'>\n");
            for (int i = 0; i < titulos.length; i++) {
                tabela.append("<TD>" + titulos[i] + "</TD>\n");
            }
            tabela.append("</TR>\n");
            for (int i = 0; i < l.size(); i++) {
                if (i % 2 == 0) {
                    tabela.append("<TR>\n");
                } else {
                    tabela.append("<TR class=\"impar\">\n");
                }

                for (int h = 0; h < metodos.length; h++) {
                    if (metodos[h].getName().contains("get" + chave)) {
                        tabela.append("<TD><input class='radio' type='radio' name='" + Character.toLowerCase(metodos[h].getName().substring(3).charAt(0)) + metodos[h].getName().substring(4) + "' value='" + metodos[h].invoke(l.get(i), null) + "'></TD>\n");
                    }
                }
                for (int j = 0; j < metodos.length; j++) {
                    for (int k = 0; k < atributos.length; k++) {
                        atributos[k] = atributos[k].substring(0, 1).toUpperCase().concat(atributos[k].substring(1));
                        if (metodos[j].getName().contains("get" + atributos[k])) {

                            tabela.append("<TD>" + metodos[j].invoke(l.get(i), null) + "</TD>\n");

                        }
                    }



                }
                tabela.append("</TR>");
            }
            tabela.append("</TABLE>");
        } catch (Throwable e) {
            System.err.println(e);
        }
        return tabela.toString();
    }
}
